package com.luxsoft.sw3.contabilidad.services;

import java.text.MessageFormat;
import java.util.Date;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.luxsoft.siipap.service.KernellSecurity;
import com.luxsoft.sw3.contabilidad.dao.PolizaDao;
import com.luxsoft.sw3.contabilidad.model.Poliza;

@Transactional(propagation=Propagation.SUPPORTS,readOnly=true)
public class PolizasManagerImpl implements PolizasManager{
	
	private PolizaDao polizaDao;
	
	
	public Poliza salvarPoliza(Poliza poliza) {
		return doSalvarPoliza(poliza, obtenerFechaDelSistema());
	}
	
	@Transactional(propagation=Propagation.REQUIRED)
	public Poliza doSalvarPoliza(Poliza poliza,Date time){
		poliza.setFolio(polizaDao.buscarProximaPoliza(poliza.getYear(), poliza.getMes(), poliza.getTipo()));
		registrarBitacora(poliza,time);
		poliza=polizaDao.save(poliza);
		return poliza;
	}	
	
	public Poliza cancelarPoliza(Poliza poliza) {
		return doCancelarPoliza(poliza, obtenerFechaDelSistema());
	}
	
	@Transactional(propagation=Propagation.REQUIRED)
	private Poliza doCancelarPoliza(Poliza poliza,Date time){
		poliza.getPartidas().clear();		
		String pattern="CANCELADA :{0,date,short}";
		poliza.setDescripcion(MessageFormat.format(pattern, new Date()));
		registrarBitacora(poliza,time);
		poliza=polizaDao.save(poliza);
		return poliza;
	}
	
	public PolizaDao getPolizaDao() {
		return polizaDao;
	}

	public void setPolizaDao(PolizaDao polizaDao) {
		this.polizaDao = polizaDao;
	}
	
	@Autowired
	private HibernateTemplate hibernateTemplate;
	
	@Autowired
	private JdbcTemplate jdbcTemplate;

	public HibernateTemplate getHibernateTemplate() {
		return hibernateTemplate;
	}

	public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
		this.hibernateTemplate = hibernateTemplate;
	}

	public JdbcTemplate getJdbcTemplate() {
		return jdbcTemplate;
	}

	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}
	
	public synchronized Date obtenerFechaDelSistema(){
		return (Date)getJdbcTemplate().queryForObject("select now()", Date.class);
	}
	
	@Transactional(propagation=Propagation.SUPPORTS,readOnly=false)
	private void registrarBitacora(Poliza bean,Date time){
		String user=KernellSecurity.instance().getCurrentUserName();	
		String ip=KernellSecurity.getIPAdress();
		String mac=KernellSecurity.getMacAdress();
		
		bean.getLog().setModificado(time);
		bean.getLog().setUpdateUser(user);
		bean.getAddresLog().setUpdatedIp(ip);
		bean.getAddresLog().setUpdatedMac(mac);
		
		
		if(bean.getId()==null){
			bean.getLog().setCreado(time);
			bean.getLog().setCreateUser(user);
			bean.getAddresLog().setCreatedIp(ip);
			bean.getAddresLog().setUpdatedMac(mac);
		}
		
	}
	
	

}


